const express = require("express")
const { randomCode, sendCode } = require('../../../../util/getMessage')
const { getToken } = require('../../../../util/getToken')
const moment = require('moment')
// 加载核心加密库
const CryptoJS = require("crypto-js")
// 加载des算法
const tripleDes = require("crypto-js/tripledes")
/*  
! 演示用法
? 加密：tripleDes.encrypt('字符串', '签名').toString()
? 解密：tripleDes.decrypt(密文, '签名').toString(CryptoJS.enc.Utf8)
* 开始加密，并且返回密文
* const cipherText = tripleDes.encrypt("验证码内容", 'des-msg').toString()
*  解密
* const plainText = tripleDes.decrypt(cipherText, 'des-msg').toString(CryptoJS.enc.Utf8)
*  输出密文和解密后的内容
* console.log('密文：' + cipherText)
* console.log('原文：' + plainText)
 */


const msgRouter = express.Router()

// 发送验证码
msgRouter.get('/', (req, res) => {
  const { phone } = req.query
  const rule = /^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/
  // 校验
  if (!phone || !rule.test(phone)) return res.sendResult(null, 400, "请输入正确的手机号")
  //生成6位数字随机验证码
  const code = randomCode(6)
  sendCode(phone, code, success => {
    // 阻断
    if (!success) return res.sendResult(null, 400, "短信验证码发送失败")
    // 记录时间
    const createTime = Date.now()
    // 加密
    const cipherText = tripleDes.encrypt(code, `DES-${phone}`).toString()
    res.sendResult({ cipherText, createTime }, 200, "短信验证码已发送")
  })
})

// 校验验证码 + 免密登录/注册
msgRouter.post('/login', async (req, res) => {
  console.log('验证码登录')
  // 校验验证码
  const { phone, cipherText, plainText, createTime } = req.body
  if (!phone || !cipherText || !plainText || !createTime) return res.sendResult(null, 400, "缺少必传参数")
  // 校验是否过期（一分钟）
  const isTimeOut = (Date.now() - createTime) > (5000 * 60)
  if (isTimeOut) return res.sendResult(null, 401, "验证码已过期，请重新获取")
  // 解密
  const text = tripleDes.decrypt(cipherText, `DES-${phone}`).toString(CryptoJS.enc.Utf8)
  if (text !== plainText) return res.sendResult(null, 400, "验证码错误")
  // res.sendResult(null, 200, "验证成功")

  // 登录/注册
  const user = await res.execSql(`SELECT * FROM user WHERE username = '${phone}'`)
  let id = user[0] ? user[0].user_id : ''
  // 用户不存在 - 注册
  if (!user[0]) {
    const create_time = moment(Date.now()).format('YYYY-MM-DD hh:mm:ss')
    const { insertId } = await res.execSql(
      `INSERT INTO user(username, password, user_tel, create_time, update_time) VALUES('${phone}', '123456', '${phone}','${create_time}','${create_time}')`)
    id = insertId
  }
  const token = getToken(id)

  res.sendResult({ token, userId: user[0].user_id }, 200, `账号：${phone} 登录成功`)
})

module.exports = msgRouter